<?php

/**
 * This is the model class for table "conso_edf_releves".
 *
 * The followings are the available columns in table 'conso_edf_releves':
 * @property string $serialPort
 * @property string $dte
 * @property string $hp
 * @property string $hc
 * @property string $diffhp
 * @property string $diffhc
 * @property string $difftps
 */
class ConsoEdfReleve extends CActiveRecord {

    //public $serialPort = '/dev/ttyAMA0';

     // Champs calculés
    public $dteGroup = null;   
    public $duree = null;
    
    
    /**
     * Returns the static model of the specified AR class.
     * @param string $className active record class name.
     * @return ConsoEdfReleve the static model class
     */
    public static function model($className = __CLASS__) {
	  return parent::model($className);
    }

    /**
     * @return string the associated database table name
     */
    public function tableName() {
	  return 'mesures_consoedf_releves';
    }

    /**
     * @return array validation rules for model attributes.
     */
    public function rules() {
	  // NOTE: you should only define rules for those attributes that
	  // will receive user inputs.
	  return array(
		array('dte, hp, hc, diffhp, diffhc, difftps', 'safe'),
		// The following rule is used by search().
		// Please remove those attributes that should not be searched.
		array('dte, hp, hc, diffhp, diffhc, difftps', 'safe', 'on' => 'search'),
	  );
    }

    /**
     * @return array relational rules.
     */
    public function relations() {
	  // NOTE: you may need to adjust the relation name and the related
	  // class name for the relations automatically generated below.
	  return array(
	  );
    }

    /**
     * @return array customized attribute labels (name=>label)
     */
    public function attributeLabels() {
	  return array(
		'dte' => 'Date et heure du relevé',
		'hp' => 'Relevé heures pleines',
		'hc' => 'Releve heures creuses',
		'diffhp' => 'Diff relevés prec hp',
		'diffhc' => 'Diff relevés prec hc',
		'difftps' => 'Durée relevé prec',
	  );
    }

    
    
    
    
    /*
     * Lecture de la température à partir de la sonde
     * avec vérification de la valeur lue
     */

    public function getConso() {

	  // Récupération des données de la teleinfo sous forme d'un tableau des lignes récupérées
	  $this->dte = date('Y-m-d H:i');
	  $this->hp = '';
	  $this->hc = '';
	  $i = 0;

	  // On recommence tant que l'on n'a pas les 2 valeurs (max 10 tentatives)
	  while ($this->hp == '' || $this->hc == '') {
		
		$teleinfo = new TeleInfo();


		if ($this->hp == '') {
		    $this->hp = $teleinfo->HCHP['valeur'];
		}
		if ($this->hc == '') {
		    $this->hc = $teleinfo->HCHC['valeur'];
		}

		echo $this->hp . ' / ' . $this->hc . "\n";

		$i++;
		Yii::log('Itération de mesure : ' . $i, 'info', 'mesures.ConsoEdf');

		if ($i >= 10) {
		    break;
		}
	  }

	  Yii::log('Données récupérées (hp = ' . $this->hp . ' / hc = ' . $this->hc . ')', 'info', 'mesures.ConsoEdf');


	  // On vérifie si on a les 2 valeurs
	  if ($this->hp == '' || $this->hc == '') {
		// L'une des 2 valeurs est vide
		Yii::log('Données manquantes (hp = ' . $this->hp . ' / hc = ' . $this->hc . ')', 'warning', 'mesures.ConsoEdf');
		return false;
	  }


	  // Récupération du compteur précédent pour calcul des différences
	  $relevePrec = $this->findByAttributes(array(), array('order' => 'dte DESC'));

	  // Calcul et enregistrement en base de données
	  $this->diffhp = $this->hp - $relevePrec->hp;
	  $this->diffhc = $this->hc - $relevePrec->hc;


	  $this->difftps = Yii::app()->domoHelper->dateDiff($this->dte, $relevePrec->dte);

	  // On vérifie si les diff sont >= 0
	  if ($this->diffhp < 0 || $this->diffhc < 0) {
		Yii::log('Différences invalides (hp/hpprec = ' . $this->hp . '/' . $relevePrec->hp . '/ hc = ' . $this->hc . '/' . $relevePrec->hc . ')', 'warning', 'mesures.ConsoEdf');
		return false;
	  }

	  // On vérifie si l'écart (plus de 1000x) avec les diff précédentes est abhérent (rapporté à une unité de temps)
	  $diffActuel = ($this->diffhp + $this->diffhc) / $this->difftps;
	  $diffPrec = ($relevePrec->diffhp + $relevePrec->diffhc) / $relevePrec->difftps;
	  $ratio = max($diffActuel, $diffPrec) / min($diffActuel, $diffPrec);

	  if ($ratio > 1000) {
		Yii::log('Ratio invalide (hp/hpprec = ' . $this->hp . '/' . $relevePrec->hp . '/ hc = ' . $this->hc . '/' . $relevePrec->hc . ')', 'warning', 'mesures.ConsoEdf');
		return false;
	  }

	  // Pas d'erreur au final
	  return true;
    }

    
    
    
    
    public static function getGraphHeure() {
	  $graphOptions = array(
		'title' => array('text' => 'Consommation instantanée'),
		'xAxis' => array('tickInterval' => 3600*1000),
	  );

	  $graphData = ConsoEdfReleve::getGraphData(array('groupby' => "CONCAT(SUBSTR(dte, 1,13), ':00')", 'duree' => '7 DAY'));
	  return CMap::mergeArray($graphOptions, $graphData);
    }

    /*
     * Récupération des données de consommation EDF pour les graphs
     * @options array : liste des paramètres (groupby, duree)
     * @return array
     */

    public static function getGraphData($options = array()) {
	  $criteria = new CDbCriteria();
	  $criteria->select = $options['groupby'] . ' AS dteGroup, AVG(diffhp/difftps * 60) AS diffhp, AVG(diffhc/difftps * 60) AS diffhc ';
	  $criteria->condition = 'dte >= NOW() - INTERVAL '. $options['duree'];
	  $criteria->group = 'dteGroup';
	  $criteria->order = 'dteGroup';
	  //$criteria->params = array('duree' => $options['duree']);

	  $result = ConsoEdfReleve::model()->findAll($criteria);

	  $hp = array();
	  $hc = array();

	  foreach ($result as $rs) {

		$dte = 1000 * strtotime($rs->dteGroup);
		$dte = (string) $dte;

		$hp[] = array((float) $dte, round($rs->diffhp / 1000, 1));
		$hc[] = array((float) $dte, round($rs->diffhc / 1000, 1));
	  }

	  $graph = array(

		'chart' => array('type' => 'column'),
		'yAxis' => array(
		    'title' => array('text' => 'kWh'),
		),
		'xAxis' => array('type' => 'datetime'),
		'dataLabel' => true,
		'plotOptions' => array(
		    'column' => array(
			  'stacking' => 'normal',
			  'borderWidth' => 0,
		    )
		),
		'series' => array(
		    array(
			  'name' => 'Heures pleines',
			  'data' => $hp,
			  'color' => '#ED651B',
		    ),
		    array(
			  'name' => 'Heures creuses',
			  'data' => $hc,
			  'color' => '#69CD4B',
		    ),
		),
	  );
	  return $graph;
    }

}